package com.xueqiu.movieplaymanagersystem.controller.admin.publics;

import com.github.pagehelper.PageInfo;
import com.xueqiu.movieplaymanagersystem.model.JsonResult;
import com.xueqiu.movieplaymanagersystem.service.PublicService;
import com.xueqiu.movieplaymanagersystem.utils.RegxUtils;
import com.xueqiu.movieplaymanagersystem.utils.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author xueqiu
 * @Description: 标签和分类公用的Controller逻辑封装
 */
public class PublicController {
    /**
     * 新增
     * @param publicService 具体执行类
     * @param originData 数据源
     * @param jsonResult 返回结果
     * @return 成功返回新增对象；失败返回提示
     * @param <T> Tag/Type
     */
    public static <T> JsonResult<T> save(PublicService<T> publicService, T originData, JsonResult<T> jsonResult) {
        //判断数据源参数是否合法
        if (originData == null) {
            jsonResult.Error("数据源参数不合法；不存在数据源参数");
            return jsonResult;
        }
        //执行新增
        T isAdd = publicService.save(originData);

        if (isAdd == null) {
            jsonResult.Error("新增失败！");
            return jsonResult;
        }

        List<T> resultList = new ArrayList<>();
        resultList.add(isAdd);
        jsonResult.Success("新增成功！",resultList);
        return jsonResult;
    }

    /**
     * 更新id或者名称
     * @param id 标签id/类型id
     * @param name 标签名称/类型名称
     * @param publicService 具体执行类
     * @return 更新成功与否
     */
    public static JsonResult<String> edit(String id, String name, PublicService<?> publicService) {
        JsonResult<String> jsonResult = new JsonResult<>();
        //判断参数是否完整
        if (StringUtils.isNullOrEmptyOrOnlyWhiteSpace(id) || StringUtils.isNullOrEmptyOrOnlyWhiteSpace(name)) {
            jsonResult.Error("id参数或名称参数不完整！");
            return jsonResult;
        }
        //判断名称参数是否合法
        if (RegxUtils.isHaveSpecial(name)) {
            jsonResult.Error("名称参数不合法；包含特殊字符！");
            return jsonResult;
        }
        //执行更新
        boolean isUpdate = publicService.edit(id, name);

        if (!isUpdate) {
            jsonResult.Error("更新失败！");
            return jsonResult;
        }
        jsonResult.Success("更新成功！");
        return jsonResult;
    }

    /**
     * 删除；根据id删除
     * @param id 被删除数据的id；Tag或者Type
     * @param publicService 具体执行类
     * @return 删除成功与否
     */
    public static JsonResult<String> deleteById(String id, PublicService<?> publicService) {
        JsonResult<String> jsonResult = new JsonResult<>();
        //判断id参数是否合法
        if (StringUtils.isNullOrEmptyOrOnlyWhiteSpace(id)) {
            jsonResult.Error("id参数不合法；不存在id参数");
            return jsonResult;
        }
        //执行删除
        boolean isDelete = publicService.removeById(id);

        if (!isDelete) {
            jsonResult.Error("删除失败！");
            return jsonResult;
        }
        jsonResult.Success("删除成功！");
        return jsonResult;
    }

    /**
     * 删除；根据名称列表删除
     * @param names 名称列表
     * @param publicService 具体执行类
     * @return 删除成功与否
     */
    public static JsonResult<String> deleteByIdBatch(String[] names, PublicService<?> publicService) {
        JsonResult<String> jsonResult = new JsonResult<>();
        //判断名称列表是否合法
        if (names == null || names.length == 0) {
            jsonResult.Error("名称列表参数不合法；不存在名称列表参数");
            return jsonResult;
        }

        for (String name : names) {
            if (StringUtils.isNullOrEmptyOrOnlyWhiteSpace(name)) {
                jsonResult.Error("单个名称元素不合法！");
                return jsonResult;
            }
        }

        //执行删除
        List<String> list = Arrays.asList(names);
        int delete = publicService.removeByNameBatch(list);

        if (delete == 0) {
            jsonResult.Error("批量删除失败！");
            return jsonResult;
        }
        if (delete == names.length) {
            jsonResult.Success("批量删除成功！");
            return jsonResult;
        }

        jsonResult.setCode(3);
        jsonResult.setMsg("部分数据未删除！");
        return jsonResult;
    }

    /**
     * 分页查询、条件查询
     * @param keyWord 关键字
     * @param page 当前页
     * @param limit 每页条数
     * @param publicService 具体执行类
     * @return 单页查询数据或者多页查询中的某一页数据；可能为empty
     * @param <T> Tag或者Type
     */
    public static <T> JsonResult<T> findAll(String keyWord, int page, int limit, PublicService<T> publicService) {
        JsonResult<T> jsonResult = new JsonResult<>();
        //排除""和"若干空格"这两种情况；允许null
        if (keyWord != null && (keyWord.trim().equals(""))) {
            keyWord = null;
        }
        //关键词一定是：非""、非"若干空格"；originList允许empty
        PageInfo<T> resultList = publicService.findByKeyWord(keyWord, page, limit);

        jsonResult.Success("查询成功！",resultList.getList());
        if (page != -1 && limit != -1) {
            /*int total = (int) ((Page<T>) originList).getTotal();
            jsonResult.setCount(total);*/
            jsonResult.setCount((int) resultList.getTotal());
        }
        return jsonResult;
    }

    /**
     * 判断名称参数是否合法
     * @param name 名称参数
     * @return 合法返回null；不合法返回提示
     * @param <T> Tag/Type
     */
    public static <T> JsonResult<T> isTrueString(String name) {
        JsonResult<T> jsonResult = new JsonResult<>();
        //判断名称参数是否合法
        if (StringUtils.isNullOrEmptyOrOnlyWhiteSpace(name)) {
            jsonResult.Error("名称参数不合法；不存在名称参数");
            return jsonResult;
        }
        //判断名称参数是否含有特殊字符
        if (RegxUtils.isHaveSpecial(name)) {
            jsonResult.Error("名称参数不合法；名称参数包含特殊字符");
            return jsonResult;
        }
        return null;
    }
}
